<?php
namespace app\index\controller;
header("Access-Control-Allow-Origin: http://www.importndsf.com");
header("content-type:text/html;charset=utf-8");
use app\index\model\UrlUtil;
use app\index\model\pay\H5pay;
use think\Session;
use think\Db;
use think\Controller;
use app\index\controller\GetOpenId;

require_once(dirname(__FILE__) . '/' . "../extend/wxpay/lib/WxPay.Api.php");
require_once(dirname(__FILE__) . '/' . "../extend/wxpay/lib/WxPay.Config.php");
require_once(dirname(__FILE__) . '/' . "../extend/wxpay/lib/WxPay.Data.php");
require_once(dirname(__FILE__) . '/' . "../extend/wxpay/lib/WxPay.Exception.php");
require_once (dirname(__FILE__).'/'."../../common/function.php");

class Bak
{
    public $app_id = 'wx292e1491eca7a249';//appid和app_secret在开通微信支付后接收到的邮件里面可看到

    public $mch_id = '1493550662';//商户号

    public $makesign = '9JTOvroPhcxaAnosVXkwGtWlilsCkkOR';//支付的签名，32位签名，微信商户后台设置

    public $app_secret = '7dae8aa84a022ac8e160448f01523345';

    public $parameters;

    //public $notify_url = 'http://www.mingtern.com';// 本控制器下面的 notifyurl  方法的URL路径 记得格式 是 http://......    【这是回调】

    public $error = 0;

    public $openid;

    public $data = null;


    public function __construct()
    {
        //$this->openid=getOpenIds();
    }

    #选择支付方式#
    #记得填写授权目录
    /**
     *
     * 获取jsapi支付的参数
     * @param array $UnifiedOrderResult 统一支付接口返回的数据
     * @throws WxPayException
     *
     * @return json数据，可直接填入js函数作为参数
     */
    public function gzhpay()
    {
        echo 1234;
        die();
        //$order_id=input('post.order_id');
        //$user_id=input('post.order_id');
        $user_id=30;
        $order_id=456;
        //$open_id=input('post.open_id');
        $order_info = $this->order_info($order_id, $user_id);
        //dump($order_info);die;
        //①、获取用户openid
        //return 1345;
        //②、统一下单
        $body = 'sdfsf';
        $spbill_create_ip = $this->get_client_ip(); //获得用户设备IP
        //dump($userip);die;
        $appid = "wx292e1491eca7a249";//微信给的appid 1
        $mch_id = "1493550662";//微信官方的mch_id 3
        $key = "9JTOvroPhcxaAnosVXkwGtWlilsCkkOR";//自己设置的微信商家key
        //$input->SetBody("挪丹瑞芬");
        $attach = $this->attach($order_id, $user_id, $order_info['order_number']);
        //$input->SetOut_trade_no($order_info['order_number']);
        $out_trade_no = $order_info['order_number'];
        $nonce_str = $order_info['order_number'];
        //$input->SetDevice_info('WEB');
        $total_fee = 1;
        $device_info = 'WEB';
        $time_start = date("YmdHis");
        $time_expire = date("YmdHis", time() + 600);
        //$input->SetGoods_tag("test");
        $notify_url = "http://www.importndsf.com/import_nbsm/nbsm_shopping/public/index.php/index/Wxgzhpay/notify";
        $trade_type = "JSAPI";
        //dump($open_id);
        //$openid='';
        $openid = $this->openid;
        //return $openid;
        $signA = "appid=$appid&attach=$attach&body=$body&device_info=$device_info&mch_id=$mch_id&nonce_str=$nonce_str&notify_url=$notify_url&openid=$openid&out_trade_no=$out_trade_no&spbill_create_ip=$spbill_create_ip&time_expire=$time_expire&time_start=$time_start&total_fee=$total_fee&trade_type=$trade_type";
        $strSignTmp = $signA . "&key=$key"; //拼接字符串  注意顺序微信有个测试网址 顺序按照他的来 直接点下面的校正测试 包括下面XML  是否正确
        $sign = strtoupper(MD5($strSignTmp)); // MD5 后转换成大写sign
        //echo  $strSignTmp;die;
        $post_data = "<xml>
                        <appid>$appid</appid>
                        <attach>$attach</attach>
                        <body>$body</body>
                        <device_info>$device_info</device_info>
                        <mch_id>$mch_id</mch_id>
                        <nonce_str>$nonce_str</nonce_str>
                        <notify_url>$notify_url</notify_url>
                        <openid>$openid</openid>
                        <out_trade_no>$out_trade_no</out_trade_no>
                        <spbill_create_ip>$spbill_create_ip</spbill_create_ip>
                        <time_expire>$time_expire</time_expire>
                        <time_start>$time_start</time_start>
                        <total_fee>$total_fee</total_fee>
                        <trade_type>$trade_type</trade_type>
                        <sign>$sign</sign>
                    </xml>";//拼接成XML 格式
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信传参地址
        $dataxml = $this->http_post($url, $post_data); //后台POST微信传参地址  同时取得微信返回的参数，http_post方法请看下文
        $objectxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); //将微信返回的XML 转换成数组
        dump($objectxml);die;
        return json_encode($objectxml);
        if ($objectxml['return_code'] == 'SUCCESS' && $objectxml['result_code'] == 'SUCCESS') {
            $jsApiParameters = $this->parmar($objectxml, $key);
            return json_encode($jsApiParameters);
            $jsApiParameters['money'] = $order_info['money'];
            return $result_json = json_encode(['code' => 200, 'msg' => '返回成功', 'content' => $jsApiParameters]);
        } else {
            return $result_json = json_encode(['code' => -1, 'msg' => '返回成功', 'content' => $objectxml['result_msg']]);
        }
    }
    /**
     * @return array|false|string
     * 获取客户端ip
     * @author  曹旺
     * @data  13:42
     */

    /**
     * @param $url
     * @param $data
     * @return mixed
     * post提交
     * @author  曹旺
     * @data  13:43
     */




    /**
     * @param $order_id
     * @param $user_id
     * @return array|false|mixed|\PDOStatement|string|\think\Model
     * 获取订单金额和订单号
     * @author  曹旺
     * @data  15:52
     */

    public function order_info($order_id, $user_id)
    {
        $order_info = Db::table('nbsm_order')->field('money,order_number')->where(['id' => $order_id, 'user_id' => $user_id])->find();
        return $order_info;
    }

    /**
     * @return string
     * 下单的回调函数
     * @author  曹旺
     * @data  15:51
     */

    /**
     * @param $data微信传的参数 （下单时自定义的参数）
     * @return \SimpleXMLElement[]|string
     * 获取通知数据
     * @author  曹旺
     * @data  15:52
     */

    /**
     * 编码自定义参数
     */

    /**
     * 解码自定义参数
     * author caowang.
     * date 2018/3/22
     */


    /**
     * 获取微信token
     * @author  曹旺
     * @data  10:19
     */

    /**
     *
     * 通过跳转获取用户的openid，跳转流程如下：
     * 1、设置自己需要调回的url及其其他参数，跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
     * 2、微信服务处理完成之后会跳转回用户redirect_uri地址，此时会带上一些参数，如：code
     *
     * @return 用户的openid
     */
    /**
     *
     * 构造获取code的url连接
     * @param string $redirectUrl 微信服务器回跳的url，需要url编码
     *
     * @return 返回构造好的url
     */

    /**
     *
     * 构造获取code的url连接
     * @param string $redirectUrl 微信服务器回跳的url，需要url编码
     *
     * @return 返回构造好的url
     */

    /**
     *
     * 通过code从工作平台获取openid机器access_token
     * @param string $code 微信跳转回来带上的code
     *
     * @return openid
     */

    /**
     *
     * 构造获取open和access_toke的url地址
     * @param string $code ，微信跳转带回的code
     *
     * @return 请求的url
     */

    //回调


    /**
     *  作用：产生随机字符串，不长于32位
     */




    /**
     * 将xml转为array
     * @param string $xml
     * @throws WxPayException
     */

    /**
     * 输出xml字符
     * @throws WxPayException
     **/

    /**
     * 生成签名
     * @return 签名，本函数不覆盖sign成员变量，如要设置签名需要调用SetSign方法赋值
     */
    protected function MakeSign($arr)
    {
        //签名步骤一：按字典序排序参数
        ksort($arr);
        $string = $this->ToUrlParams($arr);

        //签名步骤二：在string后加入KEY
        $string = $string . "&key=" . $this->makesign;

        //签名步骤三：MD5加密
        $string = md5($string);

        //签名步骤四：所有字符转为大写
        $result = strtoupper($string);

        return $result;
    }

    /**
     * 格式化参数格式化成url参数
     */
    protected function ToUrlParams($arr)
    {
        $buff = "";

        foreach ($arr as $k => $v) {
            if ($k != "sign" && $v != "" && !is_array($v)) {
                $buff .= $k . "=" . $v . "&";
            }
        }
        $buff = trim($buff, "&");
        return $buff;
    }

    /* // 引导跳转的方式
     public function auth($action_name, $controller_name)
     {
         //    var_dump($action_name, $controller_name);
         $bak = urlencode("http://www.xiaoziheng.club/home/".$controller_name."/".$action_name);

         $redirecr_uri =urlencode('http://www.xiaoziheng.club/home/demo/getcode?bak='.$bak);
         $url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->appid."&redirect_uri="
             .$redirecr_uri."&response_type=code&scope=snsapi_userinfo&state=".time()."#wechat_redirect";
         header('Location:'.$url);
     }

     public function __construct(Request $request)
     {
         parent::__construct();
         $this->accessToken = get_access_token();
         //获得方法
         $action_name =$request->action();
         //获得控制器
         $controller_name = $request->controller();
         if(!cookie('user')){
             if($action_name !='getcode'){
                 $this->auth($action_name, $controller_name);
             }
         }


     }
     public function getcodes(Request $request)
     {
         $code = $_GET['code'];
         if(!$code){
             echo '微信服务器故障';
             exit;
         }
         // 第二步：通过code换取网页授权中的access_token
         $url ="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->appsecret
             ."&code=".$code."&grant_type=authorization_code";
         $result =file_get_contents($url);
         $result = json_decode($result,true);
         if(!$result){
             echo '微信服务器故障';
             exit;
         }
         // 第三步：获取用户的基本信息，此操作仅限scope为snspai_userinfo
         $url ="https://api.weixin.qq.com/sns/userinfo?access_token=".$result['access_token']."&openid="
             .$result['openid']."&lang=zh_CN";
         $result =file_get_contents($url);
         $result = json_decode($result,true);
         $userInfo = db('user')->where("openid","=",$result['openid'])->find();
         if(!$userInfo){
             echo '操作数据可以';
             $data = [
                 'nickname' =>$result['nickname'] ,
                 'openid'=>$result['openid'],
                 'headimgurl'=>$result['headimgurl']
             ];
             db('user')->insert($data);
             $userInfo = $result;
         }
         // 第四步骤：跳转回跳转地址
         $bak = $_GET['bak'];
         cookie('user',$userInfo);
         header('Location:'.$bak);
     }*/

    /*
 +---------------------------------------------------------------
 |授权登录
 +---------------------------------------------------------------
 */

    public function User($callback){//传入参数为需要授权登录地址
        //$url= 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        //$this->User($url);
        if(session('openid'))//判断用户是否登录过如果登陆过
        {
            $user=model('ld_member')->where('openid',session('openid'))->find();
            if(!$user){//判断用户在数据库中是否有记录如果没有记录就清空登录状态重新发起userinfo方式用户授权
                session(null);
                $this->redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx207fa66c97a2db5c&redirect_uri=$callback&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");
            }else{//如果用户登录过并且在数据库中找到了用户的信息就把用户信息写入到模板并设置全局变量备用
                //因为用户昵称有特殊字符数据库不能存储所以进行了格式转换需要使用时重新转换回来
                $mistdata=json_decode($user['nickname']);//将数据库中json数据还原
                $user['namep']=urldecode($mistdata);//将十六进制昵称还原成中文
                $this->user=$user;
                $this->assign('user',$user);
                return true;
            }
        }else{//如果没有登录执行这部分代码
            $get = input('param.');
            if($get){//这里判断是否有get数据 如果有说明是登录授权回调 用code获取用户openid
                $appid = config('weixin.appID');//此处加载APPid可以直接写上
                $appsecret = config('weixin.appsecret');
                if(isset($get['code'])){//判断是否有code参数
                    $code=$get['code'];
                    $urlp="https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$appsecret&code=$code&grant_type=authorization_code";
                    $res = $this->https_request($urlp);//通过code获取openid
                    $userinfo= json_decode($res, JSON_UNESCAPED_UNICODE);
                    session('openid',$userinfo['openid']);
                    if($userinfo['scope']=='snsapi_base'){//判断获取方式是BASE还是userinfo
                        $user=model('ld_member')->where('openid',session('openid'))->find();
                        if(!isset($user['is_auth'])){//如果是base方式发起数据库没有用户信息就用userinfo方式重新发起
                            session(null);
                            $this->redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx207fa66c97a2db5c&redirect_uri=$callback&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");
                        }else{
                            $mistdata=json_decode($user['nickname']);//将数据库中json数据还原
                            $user['namep']=urldecode($mistdata);//将十六进制昵称还原成中文
                            $this->is_auth=$user['is_auth'];
                            $this->openid=$user['openid'];
                            $this->user=$user;
                            $this->assign('user',$user);
                            return true;
                        }
                    }else{//如果是userinfo 发起就接着调用接口获取用户详细信息
                        $token=$userinfo['access_token'];
                        $apenid=$userinfo['openid'];
                        $urln="https://api.weixin.qq.com/sns/userinfo?access_token=$token&openid=$apenid&lang=zh_CN";
                        $ress = $this->https_request($urln);//用opendi获取用户资料
                        $username= json_decode($ress, JSON_UNESCAPED_UNICODE);
                        $dataname=urlencode($username['nickname']);//将昵称中文转成16进制数字
                        $namedata=json_encode($dataname);
                        $userdata=array(
                            'openid'=>$username['openid'],
                            'nickname'=>$namedata,
                            'gender'=>$username['sex'],
                            'language'=>$username['language'],
                            'city'=>$username['city'],
                            'province'=>$username['province'],
                            'country'=>$username['country'],
                            'avatar'=>$username['headimgurl'],
                            'created_at'=>time()
                        );
                        $userstatus=model('ld_member')->allowField(true)->insert($userdata);//将数据写入到数据库
                        $user=model('ld_member')->where('openid',session('openid'))->find();//将用户信息从数据库查出来写入到模板和全局备用
                        $mistdata=json_decode($user['nickname']);//将数据库中json数据还原
                        $user['namep']=urldecode($mistdata);//将十六进制昵称还原成中文
                        $this->is_auth=$user['is_auth'];
                        $this->openid=$user['openid'];
                        $this->user=$user;
                        $this->assign('user',$user);
                        return true;
                    }
                }else{//如果get数据没有code参数 发起base方式授权登录获取CODE
                    $this->redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid='你的appid'&redirect_uri=$callback&response_type=code&scope=snsapi_base&state=2#wechat_redirect");
                }
            }
            //如果没有get数据说明是后台调用方法 发起base方式授权登录获取CODE
            $this->redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx207fa66c97a2db5c&redirect_uri=$callback&response_type=code&scope=snsapi_base&state=2#wechat_redirect");
        }
    }
}

?>
